package cn.wolfcode.business.controller;

// 导入需要的类和包
import cn.wolfcode.business.domain.BusAppointment;
import cn.wolfcode.business.service.IBusAppointmentService;
import cn.wolfcode.common.annotation.Log;
import cn.wolfcode.common.core.controller.BaseController;
import cn.wolfcode.common.core.domain.AjaxResult;
import cn.wolfcode.common.core.page.TableDataInfo;
import cn.wolfcode.common.enums.BusinessType;
import cn.wolfcode.common.utils.poi.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 汽车养修预约管理控制器
 * 这个类负责处理所有与汽车预约相关的网页请求
 * 比如：查看预约列表、添加新预约、修改预约、取消预约等
 */
@RestController  // 表示这是一个REST风格的控制器，返回JSON数据
@RequestMapping("/business/appointment")  // 设置访问路径前缀
public class BusAppointmentController extends BaseController
{
    // 注入预约服务类，用来处理具体的业务逻辑
    @Autowired
    private IBusAppointmentService busAppointmentService;

    /**
     * 查询养修信息预约列表
     * 这个方法用来获取所有的预约记录，支持分页和条件查询
     */
    @PreAuthorize("@ss.hasPermi('business:appointment:list')")  // 权限检查：只有有权限的用户才能访问
    @GetMapping("/list")  // 处理GET请求，访问路径是 /business/appointment/list
    public TableDataInfo list(BusAppointment busAppointment){
        // 开始分页（从前端传来的页码和每页数量）
        startPage();
        // 调用服务层方法，根据条件查询预约列表
        List<BusAppointment> list = busAppointmentService.selectBusAppointmentList(busAppointment);
        // 返回分页后的数据表格信息
        return getDataTable(list);
    }
    /**
     * 获取养修信息预约详细信息
     * 根据预约ID查询单个预约的详细信息
     */
    @PreAuthorize("@ss.hasPermi('business:appointment:query')")  // 权限检查
    @GetMapping(value = "/{id}")  // 处理GET请求，{id}是路径参数
    public AjaxResult getInfo(@PathVariable("id") Long id)  // @PathVariable获取路径中的id参数
    {
        // 调用服务层方法查询指定ID的预约信息，并返回成功结果
        return AjaxResult.success(busAppointmentService.selectBusAppointmentById(id));
    }

    /**
     * 新增养修信息预约
     * 客户可以通过这个接口预约汽车养修服务
     */
    @PreAuthorize("@ss.hasPermi('business:appointment:add')")  // 权限检查
    @Log(title = "养修信息预约", businessType = BusinessType.INSERT)  // 记录操作日志
    @PostMapping  // 处理POST请求，用于新增数据
    public AjaxResult add(@RequestBody BusAppointment busAppointment){  // @RequestBody接收JSON格式的预约信息
        // 调用服务层方法插入新的预约记录，并返回操作结果
        return toAjax(busAppointmentService.insertBusAppointment(busAppointment));
    }

    /**
     * 修改养修信息预约
     * 可以修改预约的时间、车辆信息等
     */
     @Log(title = "养修信息预约", businessType = BusinessType.UPDATE)  // 记录操作日志
    @PutMapping  // 处理PUT请求，用于更新数据
    public AjaxResult edit(@RequestBody BusAppointment busAppointment){  // 接收要修改的预约信息
        // 调用服务层方法更新预约记录，并返回操作结果
        return toAjax(busAppointmentService.updateBusAppointment(busAppointment));
    }

    /**
     * 删除养修信息预约
     * 可以批量删除多个预约记录
     */
    @PreAuthorize("@ss.hasPermi('business:appointment:remove')")  // 权限检查
    @Log(title = "养修信息预约", businessType = BusinessType.DELETE)  // 记录操作日志
    @DeleteMapping("/{ids}")  // 处理DELETE请求，{ids}支持多个ID用逗号分隔
    public AjaxResult remove(@PathVariable Long[] ids)  // 接收要删除的预约ID数组
    {
        // 调用服务层方法批量删除预约记录，并返回操作结果
        return toAjax(busAppointmentService.deleteBusAppointmentByIds(ids));
    }
    /**
     * 导出预约信息到Excel文件
     * 可以将预约数据导出为Excel表格，方便查看和统计
     */
    @PreAuthorize("@ss.hasPermi('business:appointment:export')")  // 权限检查
    @Log(title = "养修信息预约", businessType = BusinessType.EXPORT)  // 记录操作日志
    @PostMapping("/export")  // 处理POST请求
    public void export(HttpServletResponse response, BusAppointment busAppointment)
        {
        // 查询要导出的预约数据列表
        List<BusAppointment> list = busAppointmentService.selectBusAppointmentList(busAppointment);
        // 创建Excel工具类实例
        ExcelUtil<BusAppointment> util = new ExcelUtil<BusAppointment>(BusAppointment.class);
        // 导出Excel文件，文件名为"养修信息预约数据"
        util.exportExcel(response, list, "养修信息预约数据");
    }
    /**
     * 取消预约
     * 客户或管理员可以取消已有的预约
     */
    @PatchMapping(value = "/{id}",headers = "cmd=cancel")  // PATCH请求，通过header区分操作类型
    public AjaxResult cancelOp(@PathVariable("id") Long id){
        // 调用服务层方法取消指定ID的预约
        return toAjax(busAppointmentService.cancel(id));
    }

    /**
     * 客户到店功能实现
     * 当客户实际到达店铺时，更新预约状态为"已到店"
     */
    @PatchMapping(value = "/{id}",headers = "cmd=arrival")  // PATCH请求，通过header区分操作类型
    public AjaxResult  Arrival (@PathVariable("id") Long id){
        // 调用服务层方法标记客户已到店
        return toAjax(busAppointmentService.Arrival(id));
    }

}
